home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / texsis / VMS / TEXSIS10.COM < prev   
Text File  |  1992-08-02  |  62KB  |  1,289 lines

  1. $! === THIS IS AN ARCHIVE FILE -- DELETE EVERYTHING ABOVE THIS LINE ===
  2. $! === THEN EXECUTE THIS FILE WITH "@TEXSIS10.COM" ===
  3. $! Contents:
  4. $!    TXSdcol.tex
  5. $!    TXSenvmt.tex
  6. $! =========== TXSdcol.tex ============
  7. $ copy sys$input TXSdcol.tex
  8. % TXSdcol.tex                                   TeXsis version 2.15 
  9. % $Revision: 15.6 $  :  $Date: 92/06/02 15:56:46 $  :  $Author: myers $
  10. %======================================================================*
  11. % DOUBLE COLUMN FORMAT                          E. Myers and F.E. Paige
  12. %
  13. %       TXSdcol produces double-column output with balanced columns and
  14. % floating single and double column insertions. Adapted from The TeXBook,
  15. % pg 417, and The TUGboat, Vol 6, pg 29.
  16. %
  17. %       \setdoublecolumns initializes the double column format, including
  18. % setting \hsize and \vsize:
  19. %
  20. %       \setdoublecolumns#1#2#3         initializes double column format
  21. %                                       #1 = overall width
  22. %                                       #2 = overall height
  23. %                                       #3 = column width
  24. % Note that \setdoublecolumns redefines \output.
  25. %
  26. %       \doublecolumns and \enddoublecolumns are used to switch between
  27. % single and double column format:
  28. %
  29. %       \doublecolumns                  starts double column format
  30. %       \enddoublecolumns               returns to single column format and
  31. %                                       balances columns
  32. %       \longequation                   begins a long (2-column) equation
  33. %       \endlongequation                ends a long equation
  34. %       \leftcolrule                    draws a rule across left column
  35. %       \rightcolrule                   draws a rule across right column
  36. %
  37. %       Insertions of figures or other vertical mode material can be made
  38. % using the following macros, which are similar to those in Plain TeX:
  39. %
  40. %       \topinsert                      insert at top of current column
  41. %       \midinsert                      insert at current position or at top
  42. %       \pageinsert                     insert full column
  43. %       \widetopinsert                  insert across 2 columns at top of page
  44. %       \widepageinsert                 insert full page across 2 columns
  45. %       \endinsert                      end insertion
  46. %
  47. % The material is put in the left or right column depending on the current
  48. % position. A specific column can be forced by putting inside the insertion
  49. %
  50. %       \forceleft                      force left column insertion
  51. %       \forceright                     force right column insertion
  52. %
  53. % Outside of double column mode, \widetopinsert is equivalent to \topinsert.
  54. %
  55. %
  56. %       A typical TeXsis double-column document will contain:
  57. %
  58. % \texsis                                       % initialize
  59. % \setdoublecolumns{width}{height}{colwidth}    % in cm, in, pt,...
  60. % ... title page, etc ...
  61. % ... title, author, etc ...                    % default is single column
  62. % \doublecolumns                                % switch to 2 columns
  63. % ... text ...
  64. % \longequation
  65. % $$
  66. % ... long equation, table, etc ...             % across both columns
  67. % $$
  68. % \endlongequation
  69. % ... text ...
  70. % \figure{foo}                                  % insert at top of column
  71. % ... top matter ...
  72. % \endfigure                                    % end insertion
  73. % ... text ...
  74. % \enddoublecolumns                             % end
  75. % \bye
  76. %
  77. %       Since double columns are narrow, the normal TeX spacing will produce
  78. % many overfull hboxes. To avoid this, the interword skip \spaceskip is
  79. % replaced by \doublecolskip with the default value
  80. %       \doublecolskip=.3333em plus .3333em minus .1em
  81. % and the \hyphenpenalty is set to zero. To balance the columns, it is
  82. % necessary to allow some vertical stretch; for example use
  83. %       \parskip=\smallskipamount
  84. %
  85. %       To type oversize documents on an 8.5 x 11 inch laser printer, use
  86. % \ninepoint and set the dimensions in \setdoublecolumns to 9/12 of the
  87. % desired size. Then the document enlarged by 4/3 will be correct.
  88. %
  89. %
  90. %       WARNING: Formatting double column documents is very difficult. There
  91. % are many special cases, only some of which are handled in these macros.
  92. % The following is a list of known problems:
  93. %
  94. %       (1) Since double columns are narrow, the normal TeX spacing produces
  95. % many overfull \hbox's. To avoid this, the interword skip \spaceskip is
  96. % changed to
  97. %       \doublecolskip=.3333em plus .3333em minus .1em
  98. % More uniform spacing can be obtained by changing \doublecolskip.
  99. %
  100. %       (2) To balance columns it is essential to have some stretch in the
  101. % column. For example, use
  102. %       \parskip=\smallskipamount
  103. % (This is done automatically in \IEEEproceedings.)
  104. %
  105. %       (3) If the page cannot be balanced, an error message is produced. To
  106. % see the page, try typing i\vfill after the ? prompt.
  107. %
  108. %       (4) Insertions which do not fit on a page move to the same column
  109. % of the next page, so figures may appear in the wrong order. To fix this
  110. % move the insertion to a different position or use \forceleft or \forceright.
  111. %
  112. %       (5) A \topinsert placed after a \midinsert may appear before it, just
  113. % as in Plain. To avoid this, rearrange the figures or use \topinsert for all
  114. % figures.
  115. %
  116. %       (6) Footnotes are not implemented. These may be added in the future.
  117. %
  118. %       (7) Running headlines and footlines are added to each page. But
  119. % forming the double columns destroys the top and bottom marks on the page,
  120. % so the standard TeXsis headlines and footlines do not work very well.
  121. %
  122. %-----------------------------------------------------------------------
  123. %      \twinout is much simpler than \setdoublecolumns; it simply
  124. % redefines \output to produce a reduced format output with two pages per
  125. % physical page in landscape format. Usage with TeXsis:
  126. %
  127. %      [\twinhsize=<dimen>]                     % horizontal width
  128. %      [\twinvsize=<dimen>]                     % vertical height
  129. %      [\twincsize=<dimen>]                     % column width
  130. %      [\def\LandscapeSpecial{\special{...}}]   % \special for landscape
  131. %      \texsis
  132. %      \tenpoint
  133. %      \def\Tbf{\twelvebf}
  134. %      \def\tbf{\tenbf}
  135. %      \twinout
  136. %
  137. % Adapted from Harvmac by Paul Ginsparg.
  138. % -----------------------------------------------------------------------
  139. %
  140. %       Dependencies: This file is independent of the rest of TeXsis and
  141. % can be used with Plain TeX.
  142. %
  143. % -----------------------------------------------------------------------
  144. \message{Double Column Format.}
  145.  
  146. \catcode`@=11                                   % make @ a letter for this file
  147.  
  148. \newdimen\colwidth                              % col. width
  149. \newdimen\pagewidth                             % total width
  150. \newdimen\pageheight                            % total height
  151. \newdimen\ruleht          \ruleht=.5pt          % col. rule height
  152. \newdimen\colmaxdepth     \colmaxdepth=4pt      % max. split depth
  153.  
  154. \newdimen\bigc@lheight                          % 2 * col. height
  155. \newdimen\l@ftpluscenter                        % left + middle
  156. \newdimen\splitmaxs@ve                          % save \splitmaxdepth
  157. \newdimen\s@vesize                              % save \vsize
  158.  
  159. %       TXShead.tex defines similar dimensions for headlines, but if if
  160. % has not been loaded then we need to create new ones.
  161.  
  162. \newdimen\wideheadlineoffset \wideheadlineoffset=0.0pt % how much to raise
  163. \newdimen\widefootlineoffset \widefootlineoffset=0.0pt % how much to lower
  164.  
  165. \newskip\s@veskip                               % save \spaceskip
  166. \newskip\doublecolskip                          % new \spaceskip
  167. \doublecolskip=.3333em plus .3333em minus .1em  % with more stretch
  168.  
  169. \newbox\partialpage                             % partial page
  170.  
  171. \newinsert\leftins        \count\leftins=1000   % left col. insert
  172. \dimen\leftins=\maxdimen  \skip\leftins=0pt     %
  173. \newinsert\rightins       \count\rightins=1000  % right col. insert 
  174. \dimen\rightins=\maxdimen \skip\rightins=0pt    %
  175.  
  176. \newif\ifleftc@lumn                             % insert left col.
  177. \newif\ifwid@           \wid@false              % wide insert
  178.  
  179. %----------------------------------------------------------------------*
  180. %     Until or unless you say \setdoublecolumns, the \doublecolumns,
  181. % \enddoublecolumns, \leftcolrule and \rightcolrule macros are
  182. % simply \relax.  This is so you can put these in a document that 
  183. % uses double columns, but then print it with one of the single
  184. % column formats without them getting in the way.  Or vice versa.
  185. %
  186. %     For the same reason, \widetopinsert and \widefullinsert are just
  187. % \topinsert and \fullinsert. There is no need to define the table and 
  188. % figure macros here because they use appropriate the inserts.
  189.  
  190. \colwidth=\hsize                        % default column width is \hsize
  191.  
  192. \def\doublecolumns{\relax}
  193. \def\enddoublecolumns{\relax}
  194. \def\leftcolrule{\relax}
  195. \def\rightcolrule{\relax}
  196. \def\longequation{\relax}
  197. \def\endlongequation{\relax}
  198. \def\newcolumn{\relax}
  199. \def\widetopinsert{\topinsert}
  200. \def\widepageinsert{\pageinsert}
  201.  
  202. \def\begindoublecolumns{\doublecolumns} % synonym
  203. \def\singlecolumn{\enddoublecolumns}    % synonym
  204.  
  205. %       Save Plain definitions of inserts to we can use them
  206.  
  207. \let\topinsertpl@in=\topinsert
  208. \let\midinsertpl@in=\midinsert
  209. \let\pageinsertpl@in=\pageinsert
  210. \let\endinsertpl@in=\endinsert
  211.  
  212. % \@newcolumn is like \newpage but only active in double column mode
  213.  
  214. \def\@newcolumn{\vfill\eject}
  215.  
  216. %----------------------------------------------------------------------*
  217. %     \setdoublecolumns initializes double column format. #1 is the
  218. % overall width, #2 is the height, and #3 is the column width.
  219.  
  220. \def\setdoublecolumns#1#2#3{%
  221.    \global\hsize=#1\relax                       % width
  222.    \global\vsize=#2\relax                       % height
  223.    \global\colwidth=#3\relax                    % column width
  224.    \pagewidth=\hsize \pageheight=\vsize         % page sizes
  225.    \bigc@lheight=\vsize                         % total height = \vsize
  226.    \multiply \bigc@lheight by 2                 % times 2
  227.    \l@ftpluscenter=\pagewidth                   % \l@ftpluscenter = size
  228.    \advance \l@ftpluscenter by -\colwidth       % to right column
  229.    \dimen\leftins=\pageheight                   % max. insert
  230.    \dimen\rightins=\pageheight                  % max. insert
  231.    \output{\onep@geout{\unvbox255}}%            % just ship out page
  232.    \let\doublecolumns=\@doublecolumns           % enable \doublecolumns
  233.    \let\enddoublecolumns=\@enddoublecolumns     % enable \enddoublecolumns
  234.    \let\rightcolrule=\@rightcolrule             % enable
  235.    \let\leftcolrule=\@leftcolrule               %
  236.    \def\longequation{\@longequation}%           % to begin long equations
  237. }
  238.  
  239.  
  240. %     \@doublecolumns starts double column output. It redefines \endinsert
  241. % to handle double column insertions and \widetopinsert and \widepageinsert
  242. % to do them.
  243.  
  244. \def\@doublecolumns{%                           % begin 2 columns
  245.    \begingroup                                  % keep changes local
  246.    \def\endmode{\@enddoublecolumns}             % how to end 
  247.    \output={\global\setbox\partialpage=%        % set up output
  248.       \vbox{%                                   % box containing...
  249.          \ifvoid\topins\else\unvbox\topins\fi%  %top insert
  250.          \unvbox255}}\eject                     % and main page
  251.    \output={\d@ublec@lumnout}%                  % set 2 column output
  252.    \s@vesize=\vsize                             % save old \vsize
  253.    \hsize=\colwidth\vsize=\bigc@lheight         % set width, 2*height
  254.    \advance \vsize by -2\ht\partialpage         %   less partial page
  255.    \advance \vsize by -2\dp\partialpage         %   less partial page
  256.    \global\s@veskip=\spaceskip                  % save old interword glue
  257.    \global\spaceskip=\doublecolskip             % stretch for small cols.
  258.    \global\displaywidth=\colwidth               % equations have \colwidth
  259.    \global\hyphenpenalty=0                      % hyphens are OK
  260.    \let\topinsert=\topinsertd@uble              % 2-col top insert
  261.    \global\let\midinsert=\midinsertd@uble       %   mid insert
  262.    \global\let\pageinsert=\pageinsertd@uble     %   full column insert
  263.    \global\let\endinsert=\endinsertd@uble       % 2-col end inserts
  264.    \global\let\widetopinsert=\widet@pinsert     % allow wide inserts
  265.    \global\let\widepageinsert=\widep@geinsert   % or full page inserts
  266.    \global\let\newcolumn=\@newcolumn            % to break columns
  267. }
  268.  
  269. %----------------------------------------------------------------------*
  270. % \@enddoublecolumns ends double column output and balances columns.
  271. % This also allows double width equations. The grouping insures that
  272. % \endinsert is reset to the Plain version.
  273.  
  274. \def\@enddoublecolumns{%                        % end double column mode
  275.    \output={\b@lancecolumns}\eject              % output 2 columns
  276.    \global\output={\onep@geout{%                % output page =
  277.       \ifvoid\topins\else\unvbox\topins\fi      %   top insert
  278.       \unvbox255}}%                             %   plus main page
  279.    \global\vsize=\s@vesize                      % reset vsize
  280.    \endgroup                                    % end 2 col. group
  281.    \pagegoal=\vsize                             % overall goal size
  282.    \spaceskip=\s@veskip                         % reset interword glue
  283.    \displaywidth=\hsize                         %   equation width
  284.    \hyphenpenalty=50                            %   hyphen penalty
  285.    \global\let\topinsert=\topinsertpl@in        %   top insert
  286.    \global\let\midinsert=\midinsertpl@in        %   mid insert
  287.    \global\let\pageinsert=\pageinsertpl@in      %   page insert
  288.    \global\let\endinsert=\endinsertpl@in        %   end insert
  289.    \global\let\widetopinsert=\topinsertpl@in    %   wide insert
  290.    \global\let\widepageinsert=\pageinsertpl@in  %   page insert
  291.    \count\topins=1000                           % standard top insert
  292. }                                               % end of \@enddoublecolumns
  293.  
  294. %----------------------------------------------------------------------*
  295. % Output and related routines:
  296. % \onep@geout ships out a page. From the TeXbook, p. 416. Running
  297. % headlines and footlines have been added.
  298.  
  299. \def\onep@geout#1{%                             % output one page
  300.    \shipout\vbox{%                              % output a box
  301.       \offinterlineskip                         % no interline skip
  302.       \wideheadline                             % make wide headline
  303.       \vbox to \pageheight{#1%                  % box containing #1
  304.       \boxmaxdepth=\maxdepth}%                  %
  305.       \widefootline}%                           % make wide footline
  306.    \advancepageno}%                             % increment page number
  307.  
  308. %       The following are like \makeheadline and \makefootline in Plain
  309. % except that they use \pagewidth.
  310.  
  311. \def\wideheadline{%                             % make wide headline
  312.    \vbox to\z@{\vskip-22.5\p@%                  % skip up some
  313.       \vskip-\wideheadlineoffset                % and then some, if needed
  314.       \hbox to \pagewidth{%                     % like \line
  315.          \vbox to8.5\p@{}\the\headline}\vss}%   % content in \headline
  316.    \nointerlineskip}%                           %
  317.  
  318. \def\widefootline{%                             % make wide footline
  319.    \baselineskip24\p@%                          % space down
  320.    \vskip\widefootlineoffset                    % and then some, if needed
  321.    \hbox to \pagewidth{\the\footline}}%         % content in \footline
  322.  
  323. % \d@ublec@lumnout splits the page into two columns, inserting any
  324. % top insertions which have accumulated.
  325.  
  326. \def\d@ublec@lumnout{%                          %
  327.    \splitmaxs@ve=\splitmaxdepth                 % save it
  328.    \splitmaxdepth=\colmaxdepth                  % and reset it
  329.    \dimen@=\pageheight                          % total height...
  330.    \advance\dimen@ by -\ht\partialpage          % less partial page
  331.    \advance\dimen@ by -\dp\partialpage          % less partial page
  332.    \ifvoid\topins\else                          % if undone top insert
  333.       \advance\dimen@ by -\ht\topins            %   subtract its height
  334.       \advance\dimen@ by -\dp\topins\fi         %   subtract its height
  335.    \splittopskip=\topskip                       % top glue for splits
  336.    \ifdim\dimen@>\baselineskip%                 % if room for 1 line...
  337.       \setbox3=\vbox{%                          % box3 = working box
  338.          \ifvoid\leftins\else\unvbox\leftins\fi%%   left insertion
  339.          \unvbox255}%                           %   plus main material
  340.       \setbox1=\vsplit3 to \dimen@              % box1 = left column
  341.       \setbox4=\vbox{%                          % box4 = working box
  342.          \ifvoid\rightins\else\unvbox\rightins\fi%  right insertion
  343.          \unvbox3}%                             %   rest if main material
  344.       \setbox2=\vsplit4 to \dimen@              % box2 = right column
  345.       \setbox255=\vbox{\unvbox255\unvbox4}%     % rest back on output list
  346.    \else%                                       % ... else no room
  347.       \setbox1=\vbox{}%                         % so do nothing
  348.       \setbox2=\vbox{}%                         %
  349.    \fi%                                         % end if no room
  350.    \onep@geout\p@gesofar%                       % output page
  351.    \global\vsize=\bigc@lheight%                 %
  352.    \unvbox255 \penalty\outputpenalty%           %
  353.    \splitmaxdepth=\splitmaxs@ve}%               % reset it
  354.  
  355. %     \p@gesofar adds double column material to the page, putting box1 on the
  356. % left, box2 on the right.
  357.  
  358. \def\p@gesofar{%                                %
  359.    \ifvoid\topins\else\unvbox\topins\fi         % unbox top insert
  360.    \unvbox\partialpage                          % unbox partial page
  361.    \wd1=\hsize \wd2=\hsize                      % set sizes
  362.    \hbox to \pagewidth{\box1\hfil\box2}}%       % and combining 2 boxes
  363.  
  364. %       \b@lancecolumns is the output routine for 2 balanced columns. Taken
  365. % from The TeXbook, p. 417, with major modifications.
  366.  
  367. \def\b@lancecolumns{%                           %
  368.    \splitmaxs@ve=\splitmaxdepth%                % save it
  369.    \splitmaxdepth=\colmaxdepth%                 % and reset it
  370.    \setbox0=\vbox{%                             % box0 = working box
  371.       \ifvoid\leftins\else\unvbox\leftins\fi%   %   left insert
  372.       \unvbox255}%                              %   plus main page
  373.    \dimen@=\ht0 \advance\dimen@ by \dp0%        % get height
  374.    \ifvoid\rightins\else%                       % if right insert
  375.       \advance \dimen@ by \ht\rightins%         %   add its height
  376.       \advance \dimen@ by \dp\rightins\fi%      %   add its height
  377.    \ifvoid\topins\else                          % if undone top insert
  378.       \advance\dimen@ by -\ht\topins            %   subtract its height
  379.       \advance\dimen@ by -\dp\topins\fi         %   subtract its height
  380.    \advance \dimen@ by \topskip                 % add top skip
  381.    \advance \dimen@ by -\baselineskip           % add baseline skip
  382.    \divide \dimen@ by 2%                        % and divide by 2
  383.    \splittopskip=\topskip                       % top skip for split boxes
  384. % Loop over possible splits of text into left and right columns.
  385.    {\vbadness=10000 \loop%                      % suppress errors
  386.       \setbox3=\copy0%                          % box3 = working copy
  387.       \setbox6=\copy\rightins%                  % box6 = working rightins
  388.       \global\setbox4=\vbox{%                   % box 4 =
  389.          \vsplit3 to\dimen@}%                   %   left column
  390.       \global\setbox5=\vbox{%                   % box5 = right column
  391.          \ifvoid\rightins\else\unvbox6\fi%      %   right insert
  392.          \unvbox3}%                             %   rest of text
  393.       \ifdim\ht5>\dimen@%                       % if box5 too big,
  394.          \global\advance\dimen@ by 1pt\repeat}% %   increment and try again
  395. % End loop over possible splits. Set up output.
  396.    \dimen@ = \ht4 \dimen5 = \ht5%               % get heights
  397.    \ifdim\dimen5 > \dimen@ \dimen@=\dimen5 \fi% % find larger
  398.    \setbox1=\vbox to \dimen@{\unvbox4}%         % box1 = left column
  399.    \setbox2=\vbox to \dimen@{\unvbox5}%         % box2 = right column
  400.    \global\output={\b@lancingerror}%            % prepare for error
  401.    \p@gesofar%                                  % and output page
  402.    \splitmaxdepth=\splitmaxs@ve}%               % reset it
  403.  
  404.  
  405. % if there is a problem balancing the lines we display an error message
  406.  
  407.  
  408. \newhelp\b@l@ncingerror{%
  409. b@lancecolumns: I couldn't figure out how to balance the^^J
  410. two columns.  Maybe you can re-arange some text to make ^^J
  411. the job easier.  To see the page anyway try inserting a \string\vfill.}
  412.  
  413. \def\b@lancingerror{%                           % error exit
  414.    \newlinechar=10                              % ^^J is line break
  415.    \errhelp=\b@l@ncingerror                     % longer help message
  416.    \errmessage{Page cannot be balanced}%        % error message
  417.    \onep@geout{\unvbox255}}%                    % do something
  418.  
  419. %======================================================================*
  420. %       \@leftcolrule and \@rightcolrule put rules across left and right
  421. % columns for spanned equations
  422.  
  423. \def\@leftcolrule{%     Rule across bottom of left column
  424.    \vskip 2pt\nointerlineskip    % some whitespace first
  425.    \vbox to \baselineskip{\hbox to \colwidth{                    % short vertical bar at right
  426.       \hss \vrule height6pt width\ruleht}%      % and above the horiz. rule
  427.       \hrule width\colwidth height\ruleht}%     % rule
  428.    \vskip 4pt}
  429.  
  430. \def\@rightcolrule{\vskip 4pt
  431.    \moveright\l@ftpluscenter                    % move over
  432.    \vbox to \baselineskip {%
  433.        \hrule width\colwidth height\ruleht      % rule across column
  434.          \hbox to \colwidth{%                   % 
  435.       \vrule height 6pt width\ruleht\hss}%
  436.     }}
  437.  
  438. \def\@longequation{%  what to do for a long (2-column) equation
  439.    \enddoublecolumns                            % single column mode
  440.    \leftcolrule                                 % and draw a rule
  441.    \def\endlongequation{\@endlongequation}}     % how to get out
  442.  
  443. \def\@endlongequation{                          % ending a long equation
  444.     \rightcolrule                               % rule at top of right column
  445.     \doublecolumns}                             % then back to double column mode
  446.  
  447. \def\longequation{\relax}                       % default for single column
  448. \def\endlongequation{\relax}                    %   does nothing
  449.  
  450. %----------------------------------------------------------------------*
  451. % Floating insertions:
  452. %       \endinsertd@uble is a modified version of \endinsert from Plain which
  453. % decides whether to put a top insertion in the left or the right column.
  454. % \endinsert is let equal this in \doublecolumns.
  455. %       Note: Writing \ifdim\pagetotal<\dimen1 ... near the beginning of this
  456. % macro worked with an \emsg{\the\pagetotal} preceding it but failed when it
  457. % was removed. \dimen3 =\pagetotal \ifdim\dimen3 <\dimen1 ... seems to work.
  458. % Is this a bug or a feature???
  459.  
  460. \def\endinsertd@uble{\egroup%                   % finish the \vbox
  461. %       Decide whether in left or right column.
  462.    \dimen2 =\vsize%                             % 2 col. height = \vsize
  463.    \dimen1 =\dimen2 \divide\dimen1 by 2%        % 1 col height = 1/2 \dimen2
  464.    \dimen3 =\pagetotal%                         % get value of pagetotal
  465.    \ifdim\dimen3 <\dimen1 \leftc@lumntrue%      % left if page total < 1 col
  466.       \else \leftc@lumnfalse\fi                 %   right otherwise
  467.    \ifx L\LRf@rce \leftc@lumntrue \fi           % forced left
  468.    \ifx R\LRf@rce \leftc@lumnfalse \fi          % forced right
  469. %       If midinsert requested, decide whether there is room.
  470.    \if@mid                                      % midinsert selected
  471.       \dimen@\ht\z@ \advance\dimen@\dp\z@%      % dimen0 = height + depth
  472.       \advance\dimen@ \baselineskip%            % + baselineskip
  473.       \advance\dimen@\pagetotal%                % + page total
  474.       \ifleftc@lumn                             % if in left column
  475.          \ifdim\dimen@>\dimen1 %                % \dimen1 = 1 col height
  476.             \@midfalse\p@gefalse\fi             % top insert
  477.       \else%                                    % in right column
  478.          \ifdim\dimen@>\dimen2 %                % \dimen2 = 2 col height
  479.             \@midfalse\p@gefalse\fi\fi          % top insert
  480.    \fi                                          % end if@mid
  481. %       If room for midinsert, do it; otherwise make topinsert in same column.
  482.    \if@mid \bigskip\box\z@\bigbreak%            % if mid, insert
  483.    \else%                                       % doesn't fit
  484.       \ifwid@%                                  % wide insert
  485.          \count\topins=2000%                    % counts 2 x 1000 for length
  486.          \insert\topins{\penalty100%            % put wide insertion into
  487.          \topskip\z@skip\splittopskip\z@skip%   %   \topins with inserts
  488.          \splitmaxdepth\maxdimen%               %   from 1-col mode.
  489.          \floatingpenalty\z@%                   % no penalty
  490.          \hsize=\pagewidth%                     % full width
  491.          \ifp@ge \dimen@\dp\z@%                 % dimen0 = depth
  492.             \vbox to\pageheight{\unvbox\z@%     % full page = \pageheight
  493.             \kern-\dimen@}%                     %
  494.          \else \box\z@\nobreak\bigskip\fi}%     % just add box0
  495.       \else%                                    % single column insertion
  496.          \ifleftc@lumn%                         % in left column
  497.             \let\m@keins=\leftins%              %   so insert in left
  498.             \else \let\m@keins=\rightins\fi     %   or insert in right
  499.          \insert\m@keins{\penalty100%           % do the insertion just
  500.          \splittopskip\z@skip%                  % like Plain TeX...
  501.          \splitmaxdepth\maxdimen%               %
  502.          \floatingpenalty\z@%                   %
  503.          \ifp@ge \dimen@\dp\z@%                 % full page insert
  504.             \vbox to\pageheight{\unvbox\z@%     %   height is pageheight
  505.             \kern-\dimen@}%                     %   depth is 0pt
  506.          \else \box\z@\nobreak\bigskip\fi}%     % top insert
  507.       \fi                                       % end ifwid@
  508.    \fi\endgroup%                                % end if@mid
  509.    \global\let\LRf@rce=X}%                      % reset forcing flag
  510.  
  511. %     \@widetopinsert makes a floating insertion across both columns. It
  512. % uses the same \topins as the normal top insert because it goes in the same
  513. % place. \widetopinsert is let equal to this by \doublecolumns.
  514.  
  515. \def\widet@pinsert{%                           % let \widetopinsert = this
  516.    \@midfalse                                   % not mid insert
  517.    \p@gefalse                                   % not page
  518.    \wid@true                                    % is wide
  519.    \@ins                                        % Plain insert macro
  520.    \hsize=\pagewidth}                           % but set full width
  521.  
  522. \def\widep@geinsert{%                           % let \widepageinsert = this
  523.    \@midfalse                                   % not mid insert
  524.    \p@getrue                                    % not page
  525.    \wid@true                                    % is wide
  526.    \@ins                                        % Plain insert macro
  527.    \hsize=\pagewidth}                           % but set full width
  528.  
  529. %       \topinsertd@uble,... are like \topinsert,... in Plain but also reset
  530. % \ifwid@ for wide inserts. \topinsert,... are set to these by \doublecolumns.
  531. % The Plain versions must be saved to reset these in \enddoublecolumns.
  532.  
  533. \def\topinsertd@uble{\@midfalse\p@gefalse\wid@false\@ins}
  534. \def\midinsertd@uble{\@midtrue\wid@false\@ins}
  535. \def\pageinsertd@uble{\@midfalse\p@getrue\wid@false\@ins}
  536.  
  537. % \forceleft and \forceright force left and right insertions independent
  538. % of the current column position.
  539.  
  540. \def\forceleft{\global\let\LRf@rce=L}           % force left insert
  541. \def\forceright{\global\let\LRf@rce=R}          % force right insert
  542. \let\LRf@rce=X                                  % default is no force
  543.  
  544. %======================================================================*
  545. % TWIN PAGE OUTPUT
  546.  
  547. %      \twinout is much simpler than \setdoublecolumns; it simply
  548. % redefines \output to produce a reduced format output with two pages per
  549. % physical page in landscape format.
  550.  
  551. %-----------------------------------------------------------------------
  552. %      Counters and such
  553.  
  554. \newbox\l@ftp@ge                                % box for first column
  555. \newdimen\twinhsize     \twinhsize=10truein     % twin width
  556. \newdimen\twinvsize     \twinvsize=7truein      % twin height
  557. \newdimen\twincsize     \twincsize=4.75truein   % twin column width
  558. \newdimen\normhsize     \normhsize=6.5truein    % normal hsize
  559. \newdimen\normvsize     \normvsize=9.0truein    % normal vsize
  560.  
  561. %      \LandscapeSpecial is the \special hack for landscape. Otherwise
  562. % you can use the landscape option for the device driver. The default
  563. % is for dvips 5.484 by Tom Rokikki:
  564.  
  565. \def\LandscapeSpecial{\special{papersize=11in,8.5in}}
  566.  
  567. %      \twinout redefines \output to generate two columns per page.
  568. % You should also set font sizes, etc.
  569.  
  570. \def\twinout{%                                  % reduced size output
  571.    \def\l@r{L}%                                 % left-right flag
  572.    \hsize=\twincsize                            % twin col width
  573.    \vsize=\twinvsize                            % twin height
  574.    \twin@ffset                                  % twin offsets
  575.    \output={\almostship@ut{\leftline{\vbox{%    % new \output
  576.       \makeheadline\pagebody\makefootline}}}%   %   just like Plain
  577.       \advancepageno}%                          % advance number
  578. }
  579.  
  580. %      \twin@ffset sets the offsets for \twinout assuming that the
  581. % initial offsets are 0pt. Otherwise trouble...
  582.  
  583. \def\twin@ffset{%                               % set \twinout sizes
  584.    \dimen0 =\twinhsize                          % get new \hsize
  585.       \advance\dimen0 by-\normvsize             %   subtract normal
  586.       \divide\dimen0 by 2                       %   divide by 2
  587.       \global\hoffset=-\dimen0                  %   and fix \hoffset
  588.    \dimen0 =\twinvsize                          % get new \vsize
  589.       \advance\dimen0 by-\normhsize             %   subtract normal
  590.       \divide\dimen0 by 2                       %   divide by 2
  591.       \global\voffset=-\dimen0                  %   and fix \voffset
  592. }
  593.  
  594. %      \almostship@ut either builds a box or does a \shipout of the
  595. % new box plus the old \leftb@x.
  596.  
  597. \def\almostship@ut#1{%                          % new \shipout
  598.    \if L\l@r%                                   % left page
  599.       \global\setbox\l@ftp@ge=#1                %   save in box
  600.       \global\let\l@r=R                         %   set flag
  601.       \message{[\the\pageno]}%                  % page number
  602.    \else                                        % right page
  603.       \shipout\vbox{\LandscapeSpecial%          %   \special hack
  604.       \hbox to \twinhsize{\box\l@ftp@ge\hfil#1}}%%   text
  605.       \global\let\l@r=L                         % reset flag
  606.    \fi}
  607.  
  608. %-----------------------------------------------------------------------
  609. \catcode`@=12
  610.  
  611. % >>> EOF TXSdcol.tex <<<
  612. $! =========== TXSenvmt.tex ============
  613. $ copy sys$input TXSenvmt.tex
  614. %% TXSenvmt.tex                                 TeXsis version 2.15
  615. %  $Revision: 15.10 $  :  $Date: 92/07/31 15:42:00 $  :  $Author: myers $
  616. %=======================================================================*
  617. % SPECIAL TEXT ENVIRONMENTS      -  This file is a part of TeXsis
  618. %                       (C) copyright 1991 by Eric Myers and Frank Paige.
  619. %
  620. %
  621. %       These macros provide a variety of simple enviroments for arranging
  622. %   text in special ways. They are listed here and described in more
  623. %   detail below. Generally the syntax is \NAME... \endNAME.
  624. %
  625. %  The following "flush environments" arrange text in special ways:
  626. %
  627. %       \center         Center each line.
  628. %       \flushleft      Make each line flush left.
  629. %       \flushright     Make each line flush right.
  630. %       \raggedcenter   Make each line as long as possible and then
  631. %                       center it.
  632. %
  633. %  Use these in vertical mode.  For the horizontal mode equivalants
  634. %  are: \hcenter, \hflushleft, \hflushright 
  635. %
  636. %   The following are for making various sorts of lists:
  637. %
  638. %       \itemize        List of items, with a bullet in front of each.
  639. %                       Use \itm to begin each item.
  640. %       \enumerate      Makes a list of items, each of them numbered.
  641. %                       Use \itm to begin each item.
  642. %       \description    List of items and descriptions, with the form:
  643. %                         item1   text for item1, which may take
  644. %                                 more than one line
  645. %                         item2   text for item2
  646. %                               ...
  647. %                       Use \itm{item1}, etc... (see below).
  648. %
  649. %       The following display theorems and proofs in quasi-SIAM format
  650. % with automatic numbering:
  651. %
  652. %       \theorem
  653. %       \lemma
  654. %       \definition
  655. %       \proof
  656. %
  657. %       The following are designed for typing computer code, TeX examples ,
  658. %  and similar material:
  659. %
  660. %       \Listing        Prints text in \tt type, with \obeylines,
  661. %                       \obeyspaces, as appropriate for computer code
  662. %                       listings.
  663. %       \ListCodeFile{filename} to list source code from a file.
  664. %       \TeXquoteon     Makes | a TeX quote: everything in | ... | is
  665. %                       printed verbatim in \tt type.
  666. %       \TeXexample     Prints a TeX example verbatim in \tt type, with |
  667. %                       being the escape character and |endTeXexample
  668. %                       ending the enviroment. Can be used for examples
  669. %                       continuing over more than one page.
  670. %       \ttverbatim     Makes all characters ordinary and begins a group
  671. %                       using \tt type.
  672. %       \begintt        Example macro taken from The TeXbook.
  673. %       \beginlines     Example macro taken from The TeXbook.
  674. %
  675. %
  676. % Source: adapted from TechRpt's TechEnv and the TeXbook
  677. %
  678. % Dependencies: TXSmacs.tex
  679. %======================================================================*
  680. \message{Environments.}
  681. \catcode`@=11                                   % make @ a letter for now
  682. \chardef\other=12
  683.      
  684. %==================================================*
  685. % CENTERING ENVIRONMENTS: 
  686. %       \center, \flushleft, \flushright, \raggedcenter
  687. % Note: these are all \obeylines environments
  688.      
  689. \def\center{% begin centering environment
  690.    \flushenv                            % general setup
  691.    \advance\leftskip \z@ plus 1fil      % add hfil glue on each
  692.    \advance\rightskip \z@ plus 1fil     % side
  693.    \obeylines\@eatpar}                  % obey line ends
  694.      
  695. \def\flushright{% begin flush right environment
  696.     \flushenv                           % general setup
  697.     \advance\leftskip \z@ plus 1fil     % hfil on left
  698.     \obeylines\@eatpar}                 % obey line ends
  699.      
  700. \def\flushleft{% begin flush left environment
  701.    \flushenv                            % general setup
  702.    \advance\rightskip \z@ plus 1fil     % hfil on right
  703.    \obeylines\@eatpar}                  % obey line ends
  704.      
  705.  
  706. \def\flushenv{%  common startup for all flush/center environments
  707.     \vskip \z@                          % force vertical mode
  708.     \bgroup                             % begin grouping
  709.      \def\flushhmode{F}%                % flag: not hmode
  710.      \parindent=\z@  \parfillskip=\z@}  %
  711.      
  712. \def\endcenter{\endflushenv}
  713. \def\endflushleft{\endflushenv}
  714. \def\endflushright{\endflushenv}
  715.  
  716. % \@eatpar gets rid of any \par that follows
  717.      
  718. \def\@eatpar#1{\ifx#1\par\relax\else#1\fi}
  719.      
  720. %---------------------------------*
  721. %    \raggedcenter centers ragged lines, e.g. for titles.  Each line will
  722. % be as long as possible, centered. Line breaks in the manuscript file are
  723. % ignored.
  724.  
  725.  
  726. \def\raggedcenter{%     center lines as long as they can be
  727.     \flushenv                           % do common stuff
  728.     \advance\leftskip\z@ plus4em        % add stretch to sides
  729.     \advance\rightskip\z@ plus 4em      % add stretch to sides
  730.     \spaceskip=.3333em \xspaceskip=.5em %
  731.     \pretolerance=9999 \tolerance=9999  %
  732.     \hyphenpenalty=9999 \exhyphenpenalty=9999   % no hyphens!
  733.     \@eatpar}                           %
  734.  
  735. \def\endraggedcenter{\endflushenv}              % ends like all flushenv's
  736.  
  737. %---------------------------------*
  738. %    \hcenter, \hflushleft, \hflushright are like the things above,
  739. % but are for use in horizontal mode. They put the results in a box of
  740. % size zero.  This is no longer automatic in \center and its variations,
  741. % to avoid confusion.
  742. % Notes: \vtop makes the TOPS of the items line up; \vbox would make the
  743. % bottoms (actually, the baselines) line up.
  744.  
  745.      
  746. \def\hcenter{\hflushenv                         %
  747.    \advance\leftskip \z@ plus 1fil              %
  748.    \advance\rightskip \z@ plus 1fil             %
  749.    \obeylines\@eatpar}                          %
  750.  
  751. \def\hflushright{\hflushenv                     %
  752.     \advance\leftskip \z@ plus 1fil             %
  753.     \obeylines\@eatpar}                         %
  754.      
  755. \def\hflushleft{\hflushenv                      %
  756.     \advance\rightskip \z@ plus 1fil            %
  757.     \obeylines\@eatpar}                         %
  758.      
  759. \def\hflushenv{% common startup for all hflush/hcenter environments:
  760.    \def\par{\endgraf\indent}%                   % for use in hmode
  761.    \hbox to \z@ \bgroup\hss\vtop                % start a box of size zero
  762.    \flushenv\def\flushhmode{T}}                 %
  763.  
  764. \def\endflushenv{% common end to all flush/center environments
  765.    \ifhmode\endgraf\fi                          % if hmode, end \par
  766.    \if T\flushhmode \egroup\hss\fi              % close group and box, or
  767.    \egroup}                                     % end the grouping
  768.      
  769. \def\endhcenter{\endflushenv}
  770. \def\endhflushleft{\endflushenv}
  771. \def\endhflushright{\endflushenv}
  772.      
  773. %==================================================*
  774. % LIST ENVIRONMENTS:
  775. %
  776. %       All 'list' environments are surrounded by a certain amount of skip.
  777. % These skips are: \EnvTopskip, \EnvBottomskip, \EnvLeftskip, \EnvRightskip
  778. % These are set here, but you may change them if you like.
  779.      
  780. \newskip\EnvTopskip     \EnvTopskip=\medskipamount    % skip before
  781. \newskip\EnvBottomskip  \EnvBottomskip=\medskipamount    % skip after
  782. \newskip\EnvLeftskip    \EnvLeftskip=2\parindent    % left indent
  783. \newskip\EnvRightskip   \EnvRightskip=\parindent    % right margin in too
  784. \newskip\EnvDelt@skip   \EnvDelt@skip=0pt        % nested skip amount
  785. \newcount\@envDepth     \@envDepth=\z@              % depth of environments
  786.  
  787.  
  788. %       \beginEnv{<name>} does common processing for starting a 
  789. % list environment. \endEnv{<name>} does common end procesing, 
  790. % and checks the name to make sure that the environments balance.
  791.  
  792. \def\beginEnv#1{%  begin a ``list'' environment
  793.    \begingroup                          % environment is inside a group
  794.    \def\@envname{#1}%                   % save envmt name, to check at end
  795.    \ifvmode\def\@isVmode{T}%            % remember existing V/H mode
  796.    \else\def\@isVmode{F}\vskip 0pt\fi   % hmode: force vertical mode
  797. %
  798.    \ifnum\@envDepth=\@ne\parindent=\z@\fi % 1st envmt?  no parindent
  799.    \global\advance\@envDepth by \@ne    % increment level by one
  800.    \EnvDelt@skip=\baselineskip          % \EnvDelt@skip is \baselineskip
  801.    \advance\EnvDelt@skip by-\normalbaselineskip%  minus \normalbaselineskip
  802.    \@setenvmargins\EnvLeftskip\EnvRightskip % now adjust margins.
  803.    \setenvskip{\EnvTopskip}%            % get appropriate topskip
  804.    \vskip\skip@\penalty-500             % and do it (good place to break)
  805.    }
  806.      
  807.  
  808. \def\endEnv#1{%     end a ``list'' environment
  809.    \ifnum\@envDepth<1                   % is there nothing open?
  810.       \emsg{> Tried to close ``#1'' environment, but no environment open!}%
  811.       \begingroup                       % \endgroup below would produce error
  812.    \else                                % No: there was an environment open
  813.       \def\test{#1}%                    % was right thing closed?
  814.       \ifx\test\@envname\else           % check that the names match
  815.          \emsg{> Miss-matched environments!}%
  816.          \emsg{> Should be closing ``\@envname'' instead of ``\test''}%
  817.       \fi                               %
  818.    \fi                                  %
  819. %
  820.    \vskip 0pt                           % force vmode, finish any paragraph
  821.    \setenvskip\EnvBottomskip            % and skip a bottomskip which is
  822.    \vskip\skip@\penalty-500             %    appropriate here (good breakpoint)
  823.    \xdef\@envtemp{\@isVmode}%           % save \@isVmode for outside group
  824.    \endgroup                            % end grouping of environment
  825.    \global\advance\@envDepth by -\@ne   % decrement environment level
  826.    \if F\@envtemp\vskip-\parskip\noindent\fi % no indent if didn't start in vmode
  827.    }
  828.      
  829.  
  830. %       \setenvskip chooses a skip amount based on the current \@envDepth,
  831. % and puts it into \skip@, which is a temporary skip register.
  832.      
  833. \def\setenvskip#1{\skip@=#1 \divide\skip@ by \@envDepth}
  834.      
  835.  
  836. %       \@setenvmargins{<left amount>}{<right amount>} adjusts the area of
  837. %  the page to be used by changing \rightskip, \leftskip, and the display
  838. % sizes.  Values given should be skips.
  839.      
  840. \def\@setenvmargins#1#2{%     set left and right margins
  841.    \advance \leftskip  by #1    \advance \displaywidth by -#1   %
  842.    \advance \rightskip by #2    \advance \displaywidth by -#2   %
  843.    \advance \displayindent by #1}                               %
  844.      
  845.  
  846. %------------------------------*
  847. % \itemize
  848. %
  849. %       \itemize puts a bullet (or whatever you define as \itemmark)
  850. % in front of each item.  Use \itm to begin a new item.
  851.      
  852. \def\itemize{\beginEnv{itemize}% itemized list of things
  853.    \let\itm=\itemizeitem                % define \itm 
  854.    \if F\@isVmode\vskip-\parskip\fi     % if h-mode kill skip from first \itm
  855.    }
  856.  
  857. \def\itemizeitem{%      \itm for \itemize
  858.    \par\noindent                                % start new paragraph
  859.    \hbox to 0pt{\hss\itemmark\space}}%          % put marker to left
  860.      
  861. \def\enditemize{\endEnv{itemize}}%              % terminate
  862.      
  863. \def\itemmark{$\bullet$}                        % default marker for \itemize
  864.  
  865. %------------------------------*
  866. % \enumerate
  867. %       \enumerate makes a list of items, each of them numbered.  You can
  868. % nest \enumerate within \enumerate.  Begin each item with \itm.
  869. % Note the extensive use of local registers (only one \enumcnt is allocated;
  870. % TeX takes care of which one is currently needed.  \enumlead stores the
  871. % rest of the values only to print out item labels.) Note that \label
  872. % can be used to get the current value of an item label. 
  873. % Usage:
  874. %       \enumerate              % to start a list
  875. %       \itm  <text>            % for each numbered paragraph
  876. %           ...
  877. %       \endenumerate           % at end the list
  878. %
  879.  
  880. \newcount\enumDepth     \enumDepth=\z@
  881. \newcount\enumcnt
  882.      
  883. \def\enumerate{\beginEnv{enumerate}%
  884.    \global\advance\enumDepth by \@ne            % start another level of nesting
  885.    \setenumlead                                 % set the leader
  886.    \enumcnt=\z@                                 % reset counter to zero
  887.    \let\itm=\enumerateitem                      % define \itm
  888.    \if F\@isVmode\vskip-\parskip\fi     % if h-mode kill skip from first \itm
  889.    }
  890.  
  891. \def\enumerateitem{% \itm for \enumerate
  892.     \par\noindent                 
  893.     \advance\enumcnt by \@ne                    %
  894.     \edef\lab@l{\enumlead \enumcur}%            % for using \label
  895.     \hbox to \z@{\hss \lab@l \enummark          % number and punctuation
  896.        \hskip .5em}%                            % and a skip
  897.     \ignorespaces}                              %
  898.      
  899. \def\endenumerate{%                             %
  900.    \global\advance\enumDepth by -\@ne           % pop out one level
  901.    \endEnv{enumerate}}%                         % end the environment
  902.  
  903. %----------*
  904. % DIFFERENT STYLES OF EUMARATION: \enumpoints, \enumoutline,
  905. % \enumNumOutline, etc...  Design your own!
  906. %
  907. % The basic idea:  When \itm is invoked the item label is constructed
  908. % as  ``\enumlead\enumcur\enummark''  where \enumlead is the leading 
  909. % part of the label (which will be the same for all item in this level 
  910. % of the list), \enumcur is the appropriately formated value of \enumcnt, 
  911. % the item counter, and \enummark is the trailing punctuation (usually
  912. % a period, but could be a parenthesis).
  913. %
  914. % To define an enumeration style you must define \setnumlead, which
  915. % will in turn define \enumlead  when a list is begun by \enumerate.
  916. % You must also define \enumcur to put out the appropriate item label.  
  917. % Since lists can be contained within lists we use \enumDepth to keep track of
  918. % how deep we are in a sub-list.
  919. %
  920. % The styles \enumpoints, \enumoutline and \enumNumOutline should be 
  921. % considered as useful examples.  Be sure to call them BEFORE you say 
  922. % \enumerate.
  923.  
  924.  
  925. %       \enumpoints just numbers the items like so: "ii.jj.kk...."
  926. % Note the use of \edef in \setnumlead to get the CURRENT value
  927. % of \enumcur, whereas the value in the definition of \enumcur
  928. % is the value used later, when \itm is used.
  929.      
  930. \def\enumPoints{%  enumerate by numerical points
  931.    \def\setenumlead{\ifnum\enumDepth>1          % a list inside a list?
  932.           \edef\enumlead{\enumlead\enumcur.}%   % yes: lead is previous label
  933.       \else\def\enumlead{}\fi}%                 % no: just number at first
  934.    \def\enumcur{\number\enumcnt}%               %
  935.    }
  936. \def\enumpoints{\enumPoints}                    % backward compatability (2.13)
  937.  
  938.  
  939. %       \enumOutline lists the items in an outline form, using 
  940. % upper case roman numerals, upper case letters, lower case roman
  941. % numerals, lower case letters, arabic numbers, and finally bullets.
  942. % Note the use of \ifcase\enumDepth, and the macros \letterN and
  943. % \LetterN defined below.
  944.     
  945. \def\enumOutline{% enumerate a list in outline form, Roman Caps. first
  946.    \def\setenumlead{\def\enumlead{}}%           % no leading part of label
  947.    \def\enumcur{\ifcase\enumDepth               % For given level choose...
  948.      \or\uppercase{\XA\romannumeral\number\enumcnt}% 1)  UC Roman numeral
  949.      \or\LetterN{\the\enumcnt}%                 % 2) UC letter
  950.      \or\XA\romannumeral\number\enumcnt         % 3) LC Roman numeral
  951.      \or\letterN{\the\enumcnt}%                 % 4) LC letter
  952.      \or{\the\enumcnt}%                         % 5) arabic number
  953.      \else $\bullet$\space\fi}%                 % or a bullet
  954.    }
  955. \def\enumoutline{\enumOutline}                  % backward compatability (2.13)
  956.  
  957.  
  958. %       \enumNumOutline sets up an outline starting from arabic 
  959. % numbers numbers rather than Roman caps.
  960.      
  961. \def\enumNumOutline{%  enumerate a list in outline form, numbers first
  962.    \def\setenumlead{\def\enumlead{}}%           % no leading part of a label.
  963.    \def\enumcur{\ifcase\enumDepth               % for a given level choose...
  964.       \or{\XA\number\enumcnt}%                  % 1) arabic number
  965.       \or\letterN{\the\enumcnt}%                % 2) LC letter
  966.       \or{\XA\romannumeral\number\enumcnt}%     % 3) LC roman numeral
  967.       \else $\bullet$\space\fi}%                % or a bullet
  968.    }
  969. \def\enumnumoutline{\enumNumOutline}            % backward compatability (2.13)
  970.  
  971.      
  972. % \LetterN{n} gives the nth letter in the uppercase alphabet
  973. % \letterN{n} gives the nth letter in the lowercase alphabet
  974.      
  975. \def\LetterN#1{\count@=#1 \advance\count@ 64 \XA\char\count@}
  976. \def\letterN#1{\count@=#1 \advance\count@ 96 \XA\char\count@}
  977.      
  978.  
  979. % TeXsis Defaults:
  980.  
  981. \def\enummark{.}                                % default punctuation
  982. \def\enumlead{}                                 % start with nothing in label
  983. \enumpoints                                     % default style
  984.      
  985. %------------------------------*
  986. % \description gives a list of items labeled by text, not numbers.
  987. %
  988. %       foo1    text, which may take
  989. %               more than one line
  990. %       foo2    more text
  991. %
  992. % Usage:
  993. %
  994. %       \description{amount to indent as \hbox contents}
  995. %       \itm{<name1>} text1
  996. %       \itm{<name2>} text2
  997. %       ...
  998. %       \enddescription
  999. % where <name...> is the text to label the item.  <name> may take more than
  1000. % one line.
  1001. %       Typically, the argument to \description is the longest single line
  1002. % <name>.  You can also use \hskip if you want a particular distance.
  1003. % NOTE that \parindent may be 0 inside an environment, so \hskip\parindent
  1004. % probably won't do what you want.
  1005. %
  1006. % If the label text comes out wider than the indent space allowed 
  1007. % the text will be broken into several lines.  Saying \singlelinetrue 
  1008. % will instead put the label text on a line by itself above the 
  1009. % item. \singlelinefalse is the default.
  1010.      
  1011. \newbox\@desbox                 % used to determine how far to shift text
  1012. \newbox\@desline                % box for description line(s)
  1013. \newdimen\@glodeswd             % used to get \wd\@desbox inside a group
  1014. \newcount\@deslines             % used to count number of lines in description
  1015. \newif\ifsingleline \singlelinefalse            % default is to break long labels
  1016.      
  1017.  
  1018. \def\description#1{\beginEnv{description}% ``description'' list environment
  1019.    \setbox\@desbox=\hbox{#1}%                   % get template in a box
  1020.    \@glodeswd=\wd\@desbox                       % get width of that box
  1021.    \@setenvmargins{\@glodeswd}{0pt}%            % indent left margin
  1022.    \let\itm=\descriptionitem                    % define \itm
  1023.    \if F\@isVmode\vskip-\parskip\fi     % if h-mode kill \parskip from \itm
  1024.   }%                                           % end of \description
  1025.  
  1026.  
  1027. \def\descriptionitem#1{% definition of \itm for \description
  1028.    \goodbreak\noindent                          % end old item, start next
  1029.    \setbox\@desline=\vtop\bgroup                % get label text in a box
  1030.       \hfuzz=100cm\hsize=\@glodeswd             % suppress overfull box msg
  1031.       \rightskip=\z@ \leftskip=\z@              % no margins in this box
  1032.       \raggedright                              % ragged right margin in box
  1033.       \noindent{#1}\par                         % text of the label
  1034.       \global\@deslines=\prevgraf               % get line count
  1035.       \egroup                                   % end of \setbox
  1036. %
  1037.    \ifsingleline                                % long labels on their own line?
  1038.      \ifnum\@deslines>1                         % Yes: are there several lines?
  1039.         \@deslineitm{#1}%                       % Yes: put them on one line
  1040.      \else                                      % one line might ll be too long
  1041.         \setbox\@desline=\hbox{#1}%             % re-set in a box to get width
  1042.         \ifdim \wd\@desline>\wd\@desbox         % is it too wide?
  1043.             \@deslineitm{#1}%                   % Yes: set it on lone line
  1044.         \else\@desitm\fi                        % else dump the label
  1045.      \fi                                        %
  1046.    \else                                        % else \singlelinefalse
  1047.      \@desitm                                   % ...so just dump the label
  1048.    \fi                                          % end \ifsingleline
  1049.    \ignorespaces}
  1050.  
  1051. \def\@desitm{% print \description item
  1052.    \noindent
  1053.    \hbox to \z@{\hskip-\@glodeswd               % go back for indent
  1054.      \hbox to \@glodeswd{\vtop to \z@{\box\@desline\vss}% unbox it
  1055.      \hss}\hss}}                                % some glue for a fit
  1056.  
  1057. \def\@deslineitm#1{% \description item on a separate line
  1058.    \hbox{\hskip-\@glodeswd {#1}\hss}%           % Yes: label all on one line
  1059.    \vskip-\parskip\nobreak\noindent             %   then begin entry on next line
  1060.    }
  1061.  
  1062. \def\enddescription{\ifhmode\par\fi             % finish any existing \itm
  1063.    \@setenvmargins{-\wd\@desbox}{0pt}%          % doing \@setenvmargins
  1064.    \endEnv{description}}
  1065.      
  1066. %------------------------------*
  1067. %   \example is a simple way to just indent some text.  It's like
  1068. % the ``list'' environments but all it does is indent on the left
  1069. % and the right and go to singlespacing.
  1070.  
  1071.  
  1072. \def\example{\beginEnv{example}% 
  1073.    \vskip\EnvDelt@skip                          % do extra skip above
  1074.    \parskip=\z@ \parindent=\z@                  % set \par indentation to zero
  1075.    \baselineskip=\normalbaselineskip            % singlespaced
  1076.    }                                            %
  1077.  
  1078. \def\endexample{\endEnv{example}%               % end environment
  1079.    \noindent}%                                  % undo par
  1080.  
  1081. %------------------------------*
  1082. %   \Listing is an environment for computer code listings.  It's
  1083. % set in \tt type, with \obeylines and \obeyspaces and no justification.
  1084. % { and } are just characters, so to get grouping use \bgroup ... \egroup
  1085. % Indentation is controled as in the ``list'' environments.
  1086.  
  1087.  
  1088. \def\Listing{\beginEnv{Listing}%                %
  1089.    \vskip\EnvDelt@skip                          % do extra skip
  1090.    \baselineskip=\normalbaselineskip            % singlespaced
  1091.    \obeylines                                   % respect line endings
  1092.    \parskip=\z@ \parindent=\z@                  % set \par indentation to zero
  1093.    \obeyspaces\tt                               % and obey spaces too
  1094.    \def\\##1{\char92##1}%                       % \ for macro names
  1095.    \catcode`\{=\other \catcode`\}=\other        % { and } just characters
  1096.    \catcode`\(=\other \catcode`\)=\other        % ( and ) just characters
  1097.    \catcode`\"=\other \catcode`\|=\other        % " and | just characters
  1098.    \catcode`\%=\other \catcode`\&=\other        % so %  and & are characters
  1099.    \catcode`\-=\other \catcode`\==\other        % so -  and = are characters
  1100.    \catcode`\$=\other \catcode`\#=\other        % so $  and # are characters
  1101.    \catcode`\_=\other \catcode`\^=\other        % so _  and ^ are characters
  1102.    }                                            %
  1103.  
  1104. \def\endListing{\endEnv{Listing}}     % end \Listing
  1105.  
  1106.  
  1107. % Use \ListCodeFile{<filename>} to directly include a source file
  1108. % in the document.  Use this INSTEAD of \Listing, not after it.
  1109. % Nothing in this file is ``active,'' so you cannot have TeX commands
  1110. % in the file.  Example:  \ListCodeFile{hello.c}
  1111.  
  1112. \def\ListCodeFile#1{\Listing            % invoke \Listing and read in file
  1113.    \hsize=2\hsize\raggedright           % allow overflow in right margin
  1114.    \Listingtabs                         % ^^I <tab> fakes tabs
  1115.    \catcode`\\=\other                   % \ is not active!
  1116.    \input #1\relax                      % read in source file
  1117.    \endListing}
  1118.  
  1119.  
  1120. {\catcode`\^^I=\active % these lines must end with %
  1121.   \gdef\Listingtabs{\catcode`\^^I\active \let^^I=\@listingtab}
  1122. }
  1123.  
  1124. \def\@listingtab{\phantom{XXXXXXXX}}            % 1 tab = 8 spaces 
  1125.                                                 % (could be improved some day...)
  1126.  
  1127. %------------------------------*
  1128. %        \TeXexample is an environment for TeX examples. The only special
  1129. % characters are <space>, which does the usual thing, and "|", which is the
  1130. % escape character. To use a macro in this environment, begin the name with
  1131. % "|" instead of "\". In particular, |char`|| gives a |. The enviroment is
  1132. % ended with |endTeXexample, NOT \endTeXexample:
  1133. %
  1134. %       \TeXexample
  1135. %           <TeX stuff>
  1136. %       |endTeXexample
  1137. %
  1138. %  <TeX stuff> is printed in \tt type indented by \EnvLeftskip using
  1139. %  \obeylines and \obeyspaces and single spaced.  If necessary, it will
  1140. %  be split across pages.
  1141.      
  1142. \def\TeXexample{\beginEnv{TeXexample}%  % TeX examples
  1143.    \vskip\EnvDelt@skip                  % add some extra skip above
  1144.    \parskip=\z@ \parindent=\z@          % set \par indentation to zero
  1145.    \baselineskip=\normalbaselineskip    % singlespaced
  1146.    \def\par{\leavevmode\endgraf}%       % \par also gives \leavevmode
  1147.    \obeylines                           % respect line endings
  1148.    \catcode`|=\z@                       % make | the escape character
  1149.    \ttverbatim                          % begin \tt type in a group
  1150.    \@eatpar}%                           % eat initial \par
  1151.  
  1152. \def\endTeXexample{%                    % end \TeXexample
  1153.    \vskip 0pt                           % 
  1154.    \endgroup                            % end \ttverbatim
  1155.    \endEnv{TeXexample}}                 % end the environment
  1156.      
  1157. %------------------------------*
  1158. %       \ttverbatim makes everything except "|" into \other, then switches
  1159. % into \tt type. "|" is made active by \TeXquoteon and is made the escape
  1160. % character by \TeXexample and \begintt.
  1161.      
  1162. \def\ttverbatim{\begingroup                     % begin a group
  1163.    \catcode`\(=\other \catcode`\)=\other        % make everything "other"
  1164.    \catcode`\"=\other \catcode`\[=\other        %
  1165.    \catcode`\]=\other                           %
  1166.    \let\do=\uncatcode \dospecials               %
  1167.    \obeyspaces \obeylines                       % obey line ends and spaces
  1168.    \def\n{\vskip\baselineskip}%                 % \n gives a new line
  1169.    \tt}                                         % switch to typewriter type
  1170.      
  1171. \def\uncatcode#1{\catcode`#1=\other}            % make a character "other"
  1172.      
  1173. {\obeyspaces\gdef {\ }}                        % space gives \ , not \space
  1174.      
  1175. %-----------------------------------*
  1176. %       \TeXquoteon makes "|" active and a TeX quote. Anything enclosed
  1177. % in | ... | is printed verbatim in \tt type; ^^M's are ignored.
  1178. % \TeXquoteoff restores the normal |.
  1179.      
  1180. \def\TeXquoteon{\catcode`\|=\active}            % turn on "TeX quotes"
  1181. \let\TeXquoteson=\TeXquoteon                    % synonym
  1182. \def\TeXquoteoff{\catcode`\|=\other}            % turn off "TeX quotes"
  1183. \let\TeXquotesoff=\TeXquoteoff                  % synonym
  1184.      
  1185. {\TeXquoteon\obeylines                          % active "|" calls \ttverbatim
  1186.    \gdef|{\ifmmode\vert\else                    % | is \vert in math mode, but
  1187.      \ttverbatim \spaceskip=\ttglue             % to use \tt type
  1188.      \let^^M=\ %                                % and to ignore ^^M
  1189.      \let|=\endgroup                            % next | turns it off
  1190.      \fi}                                       % end of \gdef|
  1191. }     
  1192. %       \ttvert| gives a vertical bar in \tt type.  Use anywhere.
  1193. \def\ttvert{\hbox{\tt\char`\|}}
  1194.      
  1195. %-----------------------------------*
  1196. %       \begintt is taken without modification from The TeXbook, p. 421.
  1197. % Like \TeXexample, it prints a TeX example in \tt type, but it puts the
  1198. % example in a \vbox so that it cannot be split; it is ended by \endtt,
  1199. % not |endtt:
  1200. %
  1201. %       \begintt
  1202. %       <TeX stuff>
  1203. %       \endtt
  1204.      
  1205. \outer\def\begintt{$$\let\par=\endgraf \ttverbatim \parskip=0pt
  1206.    \catcode`\|=0 \rightskip=-5pc \ttfinish}
  1207.      
  1208. {\catcode`\|=0 |catcode`|\=\other       % | is temporary escape character
  1209.    |obeylines                           % end of line is active
  1210.    |gdef|ttfinish#1^^M#2\endtt{#1|vbox{#2}|endgroup$$}%
  1211. }
  1212.      
  1213. %       \beginlines is also taken without modification from The TeXbook,
  1214. % p. 421 and is also used for TeX examples. Each line of the example
  1215. % must be enclosed in TeX quotes, | ... |. Spacing can be inserted using
  1216. % \smallbreak and similar commands. The syntax is
  1217. %       \TeXquoteon
  1218. %       \beginlines
  1219. %       | <TeX stuff> |
  1220. %       ...
  1221. %       \endlines
  1222.      
  1223. \def\beginlines{\par\begingroup\nobreak\medskip\parindent=0pt
  1224.    \hrule\kern1pt\nobreak \obeylines \everypar{\strut}}
  1225.      
  1226. \def\endlines{\kern1pt\hrule\endgroup\medbreak\noindent}
  1227.  
  1228. %==================================================*
  1229. %        \theorem, \lemma, \definition, \proof, etc..
  1230. %
  1231. % Quasi-SIAM format.  Theorem and Lemma have slanted typeface statements;
  1232. % Definition does not.  Since Theorem and Lemma (and Corollary...) have
  1233. % a similar structure, we define a general \beginproclaim and \endproclaim
  1234. % (a'la PLAIN).
  1235. %
  1236. %       \beginproclaim{title}{countername}{font for text}{prefix}{tag}
  1237. % does the general formatting, where the countername (excludes the \@
  1238. % beginning the name) will be advanced.
  1239.      
  1240. \def\beginproclaim#1#2#3#4#5{\medbreak\vskip-\parskip   % space down
  1241.    \global\XA\advance\csname #2\endcsname by \@ne       % advance counter
  1242.    \edef\lab@l{\@chaptID\@sectID                        % get header plus
  1243.       \number\csname #2\endcsname}%                     % counter number
  1244.    \tag{#4#5}{\lab@l}%                                  % tag it
  1245.    \noindent{\bf #1 \lab@l.\space}%                     % print number
  1246.    \begingroup #3}                                      % begin group
  1247.      
  1248. \def\endproclaim{%
  1249.    \par\endgroup\ifdim\lastskip<\medskipamount          % end group and
  1250.    \removelastskip\penalty55\medskip\fi}                % fix spacing
  1251.      
  1252. %       \theorem{tag} defines a theorem. \Theorem{tag} refers to it in the
  1253. % text as Theorem~number.
  1254. \newcount\theoremnum           \theoremnum=\z@
  1255. \def\theorem#1{\beginproclaim{Theorem}{theoremnum}{\sl}{Thm.}{#1}}
  1256. \let\endtheorem=\endproclaim
  1257. \def\Theorem#1{Theorem~\use{Thm.#1}}
  1258.  
  1259. %       The same for lemma:
  1260. \newcount\lemmanum             \lemmanum=\z@
  1261. \def\lemma#1{\beginproclaim{Lemma}{lemmanum}{\sl}{Lem.}{#1}}
  1262. \let\endlemma=\endproclaim
  1263. \def\Lemma#1{Lemma~\use{Lem.#1}}
  1264.  
  1265. %       The same for corollary:
  1266. \newcount\corollarynum         \corollarynum=\z@
  1267. \def\corollary#1{\beginproclaim{Corollary}{corollarynum}{\sl}{Cor.}{#1}}
  1268. \let\endcorollary=\endproclaim
  1269. \def\Corollary#1{Corollary~\use{Cor.#1}}
  1270.      
  1271. %       Definitions are little special; their text is not slanted.
  1272. \newcount\definitionnum        \definitionnum=\z@     % Definition
  1273. \def\definition#1{\beginproclaim{Definition}{definitionnum}{\rm}{Def.}{#1}}
  1274. \let\enddefinition=\endproclaim
  1275. \def\Definition#1{Definition~\use{Def.#1}}
  1276.  
  1277. %       Proofs are even more special.
  1278. \def\proof{\medbreak\vskip-\parskip\noindent{\it Proof. }}
  1279.      
  1280. \def\blackslug{%                                % QED "black box"
  1281.    \setbox0\hbox{(}%                            % ( gives size
  1282.    \vrule width.5em height\ht0 depth\dp0}%      % use ) for size
  1283. \def\QED{\blackslug}                            % to end proof
  1284.      
  1285. \def\endproof{\quad\blackslug\par\medskip}
  1286.      
  1287. % >>> EOF TXSenvmt.tex <<<
  1288.